import unittest
#11.1测试函数

def get_formatted_name(first, last, middle=''): #定义一个函数，用于获取格式化的姓名。
    """生成整洁的姓名""" #使用docstring文档字符串，描述函数的功能。     
    if middle: #使用if语句，判断中间名是否存在。
        full_name = first + ' ' + middle + ' ' + last #使用变量full_name存储格式化后的姓名。
    else: #使用else语句，告诉Python，如果if中的代码块没有执行，就执行else中的代码块。
        full_name = first +' ' + last #使用变量full_name存储格式化后的姓名。
    return full_name.title() #使用return语句返回Python对象。

#11.1.1单元测试和测试用例
#单元测试是对代码的最小单位进行检查，以确定它是否按照预期的方式工作。
#测试用例是一组单元测试，它们一起核实函数在各种情形下的行为都符合要求。
#全覆盖式测试用例包含一整套单元测试，涵盖了各种可能的函数使用方式。

#11.2测试类
#测试类是一组相关的测试方法，它们一起核实函数在各种情形下的行为都符合要求。
#测试类的命名必须以Test开头，并且必须继承unittest.TestCase类。

class AnonymousSurvey(): #定义一个类，用于收集匿名调查问卷的答案。
    """收集匿名调查问卷的答案""" #使用docstring文档字符串，描述类的功能。
    def __init__(self, question): #定义一个方法，用于初始化类的属性。
        """存储一个问题，并为存储答案做准备""" #使用docstring文档字符串，描述方法的功能。
        self.question = question #使用self.question存储问题。
        self.responses = [] #使用self.responses存储答案。

    def show_question(self): #定义一个方法，用于显示问题。
        """显示调查问卷""" #使用docstring文档字符串，描述方法的功能。
        print(self.question) #使用print()函数打印问题。

    def store_response(self, new_response): #定义一个方法，用于存储答案。
        """存储单份答案""" #使用docstring文档字符串，描述方法的功能。
        self.responses.append(new_response) #使用append()方法将答案添加到列表中。

    def show_results(self): #定义一个方法，用于显示答案。
        """显示收集到的所有答案""" #使用docstring文档字符串，描述方法的功能。
        print("Survey results:") #使用print()函数打印标题。
        for response in self.responses: #使用for循环遍历列表。
            print("- " + response) #使用print()函数打印答案。

#11.2.2可通过的测试
class NameTestCase(unittest.TestCase):
    """测试get_formatted_name"""
    def test_first_last(self): #方法名为什么必须以test_开头？->因为unittest会自动运行以test_开头的方法。
        """能正确处理Janis Joplin这样的姓名吗？"""
        formatted_name = get_formatted_name('janis', 'joplin')
        self.assertEqual(formatted_name, 'Janis Joplin') #断言方法assertEqual()，核实formatted_name是否等于'Janis Joplin'。

    def test_first_last_middle(self): #方法名为什么必须以test_开头？->因为unittest会自动运行以test_开头的方法。
        """能正确处理Janis Joplin这样的姓名吗？"""
        formatted_name = get_formatted_name('wolfgang', 'mozart', 'amadeus')
        self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozart') #断言方法assertEqual()，核实formatted_name是否等于'Wolfgang Amadeus Mozart'。

# class TestAnonymousSurvey(unittest.TestCase): #定义一个类，用于测试类AnonymousSurvey。
#     """针对AnonymousSurvey类的测试""" #使用docstring文档字符串，描述类的功能。
#     def test_store_single_response(self): #定义一个方法，用于测试方法store_response()。
#         """测试单个答案会被妥善地存储""" #使用docstring文档字符串，描述方法的功能。
#         question = "What language did you first learn to speak?" #使用变量question存储问题。    
#         my_survey = AnonymousSurvey(question) #创建一个实例。
#         my_survey.store_response('English') #调用方法store_response()。
#         self.assertIn('English', my_survey.responses) #断言方法assertIn()，核实'English'是否在列表中。

#     def test_store_three_responses(self): #定义一个方法，用于测试方法store_response()。
#         """测试三个答案会被妥善地存储""" #使用docstring文档字符串，描述方法的功能。
#         question = "What language did you first learn to speak?" #使用变量question存储问题。
#         my_survey = AnonymousSurvey(question) #创建一个实例。
#         responses = ['English', 'Spanish', 'Mandarin'] #使用列表responses存储答案。
#         for response in responses: #使用for循环遍历列表。
#             my_survey.store_response(response) #调用方法store_response()。
#         for response in responses: #使用for循环遍历列表。
#             self.assertIn(response, my_survey.responses) #断言方法assertIn()，核实response是否在列表中。

#使用setUp()方法，创建一个实例。
class TestAnonymousSurvey(unittest.TestCase): #定义一个类，用于测试类AnonymousSurvey。
    """针对AnonymousSurvey类的测试""" #使用docstring文档字符串，描述类的功能。
    def setUp(self): #定义一个方法，用于创建一个实例。
        """创建一个调查对象和一组答案，供使用的测试方法使用""" #使用docstring文档字符串，描述方法的功能。
        question = "What language did you first learn to speak?" #使用变量question存储问题。
        self.my_survey = AnonymousSurvey(question) #创建一个实例。
        self.responses = ['English', 'Spanish', 'Mandarin'] #使用列表responses存储答案。

    def test_store_single_response(self): #定义一个方法，用于测试方法store_response()。
        """测试单个答案会被妥善地存储""" #使用docstring文档字符串，描述方法的功能。
        self.my_survey.store_response(self.responses[0]) #调用方法store_response()。
        self.assertIn(self.responses[0], self.my_survey.responses) #断言方法assertIn()，核实self.responses[0]是否在列表中。

    def test_store_three_responses(self): #定义一个方法，用于测试方法store_response()。
        """测试三个答案会被妥善地存储""" #使用docstring文档字符串，描述方法的功能。
        for response in self.responses: #使用for循环遍历列表。
            self.my_survey.store_response(response) #调用方法store_response()。
        for response in self.responses: #使用for循环遍历列表。
            self.assertIn(response, self.my_survey.responses) #断言方法assertIn()，核实response是否在列表中。

unittest.main() #让python运行这个文件的测试





